/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package LogicaNegocio.Controlador;

import AccesoDatos.Persistencia.Manager.ManagerEjemplar;
import AccesoDatos.Persistencia.Manager.ManagerPrestamo;
import GUI.Bibliotecario.AdminPrestamos.PanelDevolucionPrestamo;
import LogicaNegocio.Biblioteca.Ejemplar;
import LogicaNegocio.Biblioteca.Prestamo;
import MainBiblioSoft.BiblioSoft;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import javax.swing.JOptionPane;

/**
 * Esta clase en java permite el control de eventos generados
 * desde el panel devoluvion prestamo.
 *
 * @author sebaxtian
 * Archivo: ControlDevolucionPrestamo.java
 * @version 1.0
 * Fecha: dom jun  6 14:44:07 COT 2010
 */


public class ControlDevolucionPrestamo {

    //Atributos de clase
    private PanelDevolucionPrestamo panelDevolucionPrestamo;
    private EntityManagerFactory managerFactory;
    private EntityManager entityManager;

    public ControlDevolucionPrestamo(PanelDevolucionPrestamo panelDevolucionPrestamo) {
        this.panelDevolucionPrestamo = panelDevolucionPrestamo;
        managerFactory = BiblioSoft.managerFactory;
        entityManager = managerFactory.createEntityManager();
    }

    public void registrarDevolucion() {
        int identificacionUsuario = -1;
        int numeroSala = -1;
        int numeroPasillo = -1;
        int numeroEstante = -1;
        int numeroCajon = -1;
        Prestamo prestamo = null;
        Ejemplar ejemplar = null;
        try{
            identificacionUsuario = Integer.parseInt(panelDevolucionPrestamo.textFieldIdentificacion.getText());
            numeroCajon = Integer.parseInt(panelDevolucionPrestamo.textFieldNumCajon.getText());
            numeroEstante = Integer.parseInt(panelDevolucionPrestamo.textFieldNumEstante.getText());
            numeroPasillo = Integer.parseInt(panelDevolucionPrestamo.textFieldNumPasillo.getText());
            numeroSala = Integer.parseInt(panelDevolucionPrestamo.textFieldNumSala.getText());
            prestamo = buscarPrestamo(identificacionUsuario, numeroSala, numeroPasillo, numeroEstante, numeroCajon);
            if(prestamo != null){
                ejemplar = buscarEjemplar(prestamo.getIdOrden(), numeroSala, numeroPasillo, numeroEstante, numeroCajon);
                prestamo.setDevuelto(true);
                ejemplar.setDisponible(true);
                new ManagerPrestamo().devolverPrestamo(prestamo.getIdPrestamo());
                new ManagerEjemplar().actualizarEjemplar(ejemplar.getIdEjemplar(), ejemplar);
                JOptionPane.showMessageDialog(panelDevolucionPrestamo, "Ejemplar devuelto con exito", "Devolucion", JOptionPane.PLAIN_MESSAGE);
                limpiar();
            }else{
                JOptionPane.showMessageDialog(panelDevolucionPrestamo, "El ejemplar "+numeroSala+"/"+numeroPasillo+"/"+numeroEstante+"/"+numeroCajon+" no ha sido prestado al usuario "+identificacionUsuario, "Devolucion", JOptionPane.INFORMATION_MESSAGE);
            }
        }catch(NumberFormatException exc) {
            JOptionPane.showMessageDialog(panelDevolucionPrestamo, "Los datos debe ser numeros enteros", "Devolucion", JOptionPane.INFORMATION_MESSAGE);
        }
    }

    private Prestamo buscarPrestamo(int identificacionUsuario, int numeroSala, int numeroPasillo, int numeroEstante, int numeroCajon) {
        entityManager.clear();
        Prestamo prestamo = null;
        int idPrestamo = -1;
        /*
         * SELECT P.IDPRESTAMO FROM PRESTAMO P, ORDEN O WHERE P.IDORDEN = O.IDORDEN AND O.IDENTIFICACIONUSUARIO = 1143825130 AND O.IDEJEMPLAR = (SELECT E.IDEJEMPLAR FROM EJEMPLAR E WHERE E.NUMEROSALA = 1 AND E.NUMEROPASILLO = 2 AND E.NUMEROESTANTE = 2 AND E.NUMEROCAJON = 2);
         */
        Query consulta = entityManager.createQuery("SELECT p.idprestamo FROM EPrestamo p, EOrden o WHERE p.idorden = o.idorden AND o.identificacionusuario = :identificacionusuario AND o.idejemplar = (SELECT e.idejemplar FROM EEjemplar e WHERE e.numerosala = :numerosala AND e.numeropasillo = :numeropasillo AND e.numeroestante = :numeroestante AND e.numerocajon = :numerocajon)");
        consulta.setParameter("identificacionusuario", identificacionUsuario);
        consulta.setParameter("numerosala", numeroSala);
        consulta.setParameter("numeropasillo", numeroPasillo);
        consulta.setParameter("numeroestante", numeroEstante);
        consulta.setParameter("numerocajon", numeroCajon);
        try{
            idPrestamo = (Integer)consulta.getSingleResult();
            prestamo = new ManagerPrestamo().obtenerPrestamo(idPrestamo);
        }catch(NoResultException exc){
        }
        entityManager.clear();
        return prestamo;
    }

    private Ejemplar buscarEjemplar(int idOrden, int numeroSala, int numeroPasillo, int numeroEstante, int numeroCajon) {
        entityManager.clear();
        Ejemplar ejemplar = null;
        int idEjemplar = -1;
        /*
         * SELECT O.IDEJEMPLAR FROM ORDEN O WHERE O.IDORDEN = 10 AND O.IDEJEMPLAR = (SELECT E.IDEJEMPLAR FROM EJEMPLAR E WHERE E.NUMEROSALA = 1 AND E.NUMEROPASILLO = 2 AND E.NUMEROESTANTE = 2 AND E.NUMEROCAJON = 2);
         */
        Query consulta = entityManager.createQuery("SELECT o.idejemplar FROM EOrden o WHERE o.idorden = :idorden AND o.idejemplar = (SELECT e.idejemplar FROM EEjemplar e WHERE e.numerosala = :numerosala AND e.numeropasillo = :numeropasillo AND e.numeroestante = :numeroestante AND e.numerocajon = :numerocajon)");
        consulta.setParameter("idorden", idOrden);
        consulta.setParameter("numerosala", numeroSala);
        consulta.setParameter("numeropasillo", numeroPasillo);
        consulta.setParameter("numeroestante", numeroEstante);
        consulta.setParameter("numerocajon", numeroCajon);
        idEjemplar = (Integer)consulta.getSingleResult();
        ejemplar = new ManagerEjemplar().obtenerEjemplar(idEjemplar);
        entityManager.clear();
        return ejemplar;
    }

    public void limpiar() {
        panelDevolucionPrestamo.textFieldIdentificacion.setText("");
        panelDevolucionPrestamo.textFieldNumCajon.setText("");
        panelDevolucionPrestamo.textFieldNumEstante.setText("");
        panelDevolucionPrestamo.textFieldNumPasillo.setText("");
        panelDevolucionPrestamo.textFieldNumSala.setText("");
    }
}
